package com.itany.corejava.code07_面向对象.bms;

/**
 * @author: 石小俊
 * @date: 2023年03月09日 16:49
 * @version: 1.0
 * 这是账户类
 */
public abstract class Account {

    // 定义一个初始的账户编号值
    // 设置为静态变量,将变量所属交给类,而不是对象
    private static int currentId = 1000;

    // 自动生成,初始值为1000,每次开户账户编号+1,例如:1001、1002...
    private int id;
    private String name;
    private String password;
    private String personId;
    private String phone;
    private double balance;

    public Account() {
        // 由于账户编号自动生成
        // 因此,在账户的构造方法中对编号进行处理
        // 在当前类中定义一个账户编号的初始值
        // 在调用构造方法的时候,每调用一次其值+1
        // 即:每次子类在进行实例化的时候调用当前构造方法
        // 可以使得所有子类的账户编号自动生成
        this.id = currentId++;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPersonId() {
        return personId;
    }

    public void setPersonId(String personId) {
        this.personId = personId;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    /**
     * 存款,不允许子类修改,使用final修饰
     *
     * @param money
     */
    public final void deposit(double money) {
        this.balance += money;
    }

    /**
     * 取款,不同子类账户实现不一样,子类必须进行重写,因此必须设计成抽象方法
     *
     * @param money 取款金额
     * @return 取款是否成功
     */
    public abstract boolean withdrawMoney(double money);
}
